{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 第七章 决策树"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "决策树是一个经典的机器学习算法,它的预测结果容易理解,易于向业务部门解释.预测速度快,可以处理类别行数据和连续型数据.  \n",
    "本章主要的内容如下:  \n",
    "1. 信息熵和信息增益的概念,以及决策树的分裂原则\n",
    "2. 决策树的创建和剪枝算法\n",
    "3. sciktlearn中据测算算法和相关参数\n",
    "4. 使用决策树预测泰坦尼克号幸存者案例\n",
    "5. scikit-learn中模型参数选择的工具和算法\n",
    "6. 聚合算法和随机森林算法原理."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1. 算法原理\n",
    "\n",
    "决策树是一个类似于流程图的数据结构。分支节点表示对一个特征进行测试，根据测试结果进行分类，树叶节点代表一个类别。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2.决策树的创建\n",
    "\n",
    "决策树的创建过程,就是从迅雷数据集中归纳出一组分类规则,使得它与训练数据矛盾较小的同时具有较强的泛化能力.有了信息增益来量化的选择数据集的划分特征.使决策树的创建变得容易.决策树的创建基本分为以下几步:  \n",
    "1. 计算数据集划分前的信息熵\n",
    "2. 遍历所有未作为划分条件的特征,分别计算根据每个特征划分数据集后的信息熵.\n",
    "3. 选择信息增益最大的特征,并使用这个特征作为数据划分节点来划分数据.\n",
    "4. 递归的处理被划分后的所有子数据集,从未被选择的特征里继续选择最优数据划分特征来划分子数据集.\n",
    "\n",
    "递归的过程终止一般有两个条件,一个是所有特征都用完了,即没有新的特征可以用来进一步划分数据集,二是划分后的信息增益足够小了,这个时候就可以停止划分了.针对这个停止条件,需要事先选择信息增益的门限值来作为递归结束的条件.\n",
    "\n",
    "使用信息增益座额我i特征选择指标的决策树构建算法,称为ID3算法."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**1.离散化**:  \n",
    "针对特征为连续值的情况,再使用决策树的时候,需要进行离散化处理.如:当一个测量值为0~100的数值时候,这是个连续值,可以把数据划分区间,如小于多少看做一个区间,大于多少看做一个区间.经过离散处理后,就可以构建决策树了.如何进行离散化,需要结合业务开展.\n",
    "\n",
    "**2.正则项**:  \n",
    "最大化信息增益来选择特征,再决策树的构建过程中,容易造成有限选择类别最多的特征进行分类.比如说,如果我们把某个产品的唯一标识ID作为特征之一加入到数据集中,那么构建决策树时,久化有限选择产品ID作为划分特征,这样划分出来的数据,每个叶子节点只有一个样本,划分出来的数据集最纯洁,其信息增益最大.这样的结果是我们不需要的.有一个解决办法是,计算划分后的子数据集的信息熵时,加上一个与类别个数成正比的正则项,来作为最好的信息熵.这样,当算法选择的某个类别较多的特征时,让信息熵较小的时候,由于受到类别个数的正则项惩罚,导致最终的信息熵也笔记大.这样通过合适的参数,可以使得算法训练得到某种程度的平和.  \n",
    "另一个解决办法是使用信息增益比来作为特征选择的标准. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "hide_input": false,
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
